Elixirでコマンドラインアプリケーションを作る
プログラマーは普段の仕事を簡単にするために、各々便利なスクリプトを作り活用しています。
使用するプログラミング言語はどれでも良いのですが、簡単に書けて楽にCLIアプリケーションとしてビルド、リリースできる仕組みがあるとありがたいです。
ElixirにはCLIアプリケーションを簡単に作成できる escript というツールが用意されています。
今回はElixirでCLIアプリケーションを作成してみます(検証したelixirのversionは1.3.2です)。
環境構築は以下のページを参照してください。
MacにElixir開発環境を構築する
プロジェクト作成
ますコマンドラインアプリケーションのプロジェクトを作成しましょう。
mix new cli_demo
escript
escriptはElixirのアプリケーションをCLIアプリケーションとしてコンパイルする仕組みです。
これを使うには、mix.exsファイルに以下の行を追加します。
def project do [app: :cli_demo, escript: [main_module: CliDemo.CLI], # この行を追加します version: "0.0.1", elixir: "~> 1.3", build_embedded: Mix.env == :prod, start_permanent: Mix.env == :prod, deps: deps()] end
エントリポイントの作成
CLIアプリケーションのエントリポイントとなるモジュールを作成します
- projectroot/lib/cli_demo/cli.ex
defmodule CliDemo.CLI do # ここがCLIアプリケーションのエンドポイント def main(argv) do parse_args(argv) |> process end # 引数をパースする処理 def parse_args(argv) do parse = OptionParser.parse(argv, switches: [ help: :boolean], # boolean型に変換する aliases: [h: :help]) # :helpに変換する case parse do { [ help: true ], _, _} -> :help { _, message, _} -> message _ -> :help end end def process(:help) do IO.puts """ usage: cli_demo <message> """ System.halt(0) end def process(message) do IO.puts message end end
コマンドライン引数のパース処理には OptionParserライブラリを使用しています。
本題とずれるので説明は省略しますが、-h
を引数には渡すと:help
に変換され、文字列がboolean
に変換されます
アプリケーションのビルド、インストール
ビルドしてCLIアプリケーションを作成します。作成したバイナリはホームディクトリの下の.mix/escripts
に保存されるので、環境変数PATHに追加しておく必要があります。
環境変数の設定
私はZSHを使っているので.zshrcに設定しました。書き込むファイルは使っているシェルによって変えてください。
export PATH="$HOME/.mix/escripts:$PATH"
ビルド、インストール
$ mix do escript.build, escript.install Generated escript cli_demo with MIX_ENV=dev Are you sure you want to install escript "cli_demo"? [Yn] y * creating /Users/username/.mix/escripts/cli_demo
実行
早速、実行してみましょう
$ cli_demo "Elixir Rocks" Elixir Rocks
ヘルプメッセージも実装通りに表示されます
$ cli_demo -h usage: cli_demo <message>
まとめ
簡単にコマンドラインアプリケーションを作る環境が用意されているのは非常にありがたいです。
が、できればhex.pm(パッケージマネージャー, RubeGemsのElixir版)やGitHubからコマンド一発でインストールしたいものです。
現在開発版のバージョン1.4ではまさにこれらの機能が実現される予定です
mixの公式ドキュメント
-
GitHubからのインストール
mix escript.install github user/project
-
hex.pmからのインストール
mix escript.install hex hex_package